package com.ideaaedi.shardingjointable.config.sharding.support;

import com.ideaaedi.shardingjointable.entity.bo.DatasourceArgs;
import com.ideaaedi.shardingjointable.entity.bo.UpdateActualDataNodeBO;
import org.springframework.lang.NonNull;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 分表相关支持
 *
 * @author JustryDeng
 * @since 2022/10/7 14:37:06
 */
public interface ShardingTableSupport {
    
    /**
     * 初始化已存在的真实表
     * <br />
     * @param logicTableName
     *         逻辑表名
     * @param realTableNameSet
     *         真实表名
     */
    @NonNull
    void initRealTableName(String logicTableName, Set<String> realTableNameSet);
    
    /**
     * 获取逻辑表对应的已存在的真实表
     * <br />
     * @param datasourceArgs
     *         数据源参数
     * @param logicTableName
     *         逻辑表名
     *
     * @return 真实表名集合
     */
    @NonNull
    Set<String> getRealTableName(DatasourceArgs datasourceArgs, String logicTableName);
    
    /**
     * 创建真实表
     * <br />
     * @param bo 参数信息
     *
     * @return 逻辑表对应的已存在的真实表（含本次创建的真实表）
     */
    @NonNull
    Set<String> addRealTableName(@NonNull UpdateActualDataNodeBO bo);
    
    /**
     * 批量新增 真实表
     * <br />
     * @param boList 参数集合
     *
     * @return key-逻辑表名； value-逻辑表对应的已存在的真实表（含本次创建的真实表）
     */
    @NonNull
    Map<String, Set<String>> batchAddRealTableName(@NonNull List<UpdateActualDataNodeBO> boList);
    
    /**
     * 获取真实表的ddl
     * <br />
     * @param datasourceArgs
     *         数据源参数
     * @param logicTableName
     *            逻辑表名
     * @param realTableName
     *            真实表名
     *
     * @return 真实表的ddl
     */
    @NonNull
    String obtainRealTableDdl(DatasourceArgs datasourceArgs, String logicTableName, String realTableName);
}
